/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.client.assembler.input;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import fr.generali.accueilclient.client.om.IAdresse;
import fr.generali.accueilclient.client.om.ICommunication;
import fr.generali.accueilclient.client.om.IEmail;
import fr.generali.accueilclient.client.om.IPersonne;
import fr.generali.accueilclient.client.om.ISiteInternet;
import fr.generali.accueilclient.client.om.ITelephone;
import fr.generali.accueilclient.client.om.NaturePersonne;
import fr.generali.refservcommuns.clients.prima.Quantity;
import fr.generali.refservcommuns.rce.demat.communcontact.dossiercontact.DtoDossierMajDossierContact;
import fr.generali.refservcommuns.rce.demat.communcontact.dossiercontact.DtoListeDossierMajAdresse;
import fr.generali.refservcommuns.rce.demat.communcontact.dossiercontact.DtoListeDossierMajCourriel;
import fr.generali.refservcommuns.rce.demat.communcontact.dossiercontact.DtoListeDossierMajPageWeb;
import fr.generali.refservcommuns.rce.demat.communcontact.dossiercontact.DtoListeDossierMajTelephone;
import fr.generali.refservcommuns.rce.demat.communcontact.dossiercontact.DtoMajBienImmobilier;
import fr.generali.refservcommuns.rce.demat.communcontact.dossiercontact.DtoMajInformationMarketingImmobilier;
import fr.generali.refservcommuns.rce.demat.communcontact.dossiercontact.DtoMajModeExploitationFondCommerce;
import fr.generali.refservcommuns.rce.demat.servperscom.ctc.gestioncontacts.DtoAdressePostale;
import fr.generali.refservcommuns.rce.demat.servperscom.ctc.gestioncontacts.DtoCourriel;
import fr.generali.refservcommuns.rce.demat.servperscom.ctc.gestioncontacts.DtoDetailAdressePostale;
import fr.generali.refservcommuns.rce.demat.servperscom.ctc.gestioncontacts.DtoInformationCommunication;
import fr.generali.refservcommuns.rce.demat.servperscom.ctc.gestioncontacts.DtoInformationDemarchage;
import fr.generali.refservcommuns.rce.demat.servperscom.ctc.gestioncontacts.DtoPageWeb;
import fr.generali.refservcommuns.rce.demat.servperscom.ctc.gestioncontacts.DtoTelephone;

/**
 * Assembler pour dossier de contact de personne toutes natures
 *  
 * @author selrhazala
 */
@Component("personneToDtoDossierMajDossierContactConverter")
public class PersonneToDtoDossierMajDossierContactConverter implements Converter<IPersonne, DtoDossierMajDossierContact> {
    
    /**
     * Code personnel
     */
    private static final String PERSONNEL = "PER";

    /**
     * Code professionnel
     */
    private static final String PROFESSIONNEL = "PRO";
    
    /**
     * Prefix NPAI
     */
    private static final String PREFIX_MOTIF_NPAI = "n.p.a.i";
    
    /**
     * {@inheritDoc}
     */
    public DtoDossierMajDossierContact convert(IPersonne input) {
        DtoDossierMajDossierContact dossierContact = new DtoDossierMajDossierContact();
        
        // init date du jour
        XMLGregorianCalendar dateDuJour = null;
        try {
            GregorianCalendar gCalendar1 = new GregorianCalendar();
            gCalendar1.setTime(new Date());
            dateDuJour = DatatypeFactory.newInstance().newXMLGregorianCalendar(gCalendar1);
        } catch (DatatypeConfigurationException e) {
            e.getMessage();
        }

        // Données communication
        ICommunication communication = input.getCommunication();
        dossierContact.setCodecanalPrefere(communication == null ? null : communication.getCanalDePreference());
        DtoInformationDemarchage dtoInformationDemarchage = new DtoInformationDemarchage();
        dtoInformationDemarchage.setIndicateurAutorisationInformation(
                        communication == null ? false : communication.isAutorisation());
        dtoInformationDemarchage.setIndicateurDemarche(communication == null ? false : communication.isAutorisation());
        dossierContact.setDemarchage(dtoInformationDemarchage);

        // Chargement des stopComs
        DtoInformationCommunication dtoInformationCommunication = new DtoInformationCommunication();

        if (communication == null) {
            dtoInformationCommunication.setIndicateurStopCourriel(false);
            dtoInformationCommunication.setIndicateurStopCourrier(false);
            dtoInformationCommunication.setIndicateurStopFax(false);
            dtoInformationCommunication.setIndicateurStopSMS(false);
            dtoInformationCommunication.setIndicateurStopTelephone(false);
            if (NaturePersonne.PARTICULIER.equals(input.getNaturePersonne())) {
                dtoInformationCommunication.setCodeTypeModeContact(PERSONNEL);
            } else {
                dtoInformationCommunication.setCodeTypeModeContact(PROFESSIONNEL);
            }
        } else {
            dtoInformationCommunication.setIndicateurStopCourriel(!communication.isEmailOk());
            dtoInformationCommunication.setIndicateurStopCourrier(!communication.isCourrierOk());
            dtoInformationCommunication.setIndicateurStopFax(!communication.isTelephoneOk());
            dtoInformationCommunication.setIndicateurStopSMS(!communication.isSmsOk());
            dtoInformationCommunication.setIndicateurStopTelephone(!communication.isTelephoneOk());
            if (NaturePersonne.PARTICULIER.equals(input.getNaturePersonne())) {
                dtoInformationCommunication.setCodeTypeModeContact(PERSONNEL);
            } else {
                dtoInformationCommunication.setCodeTypeModeContact(PROFESSIONNEL);
            }
        }

        dossierContact.getStopCom().add(dtoInformationCommunication);

        // Données adresses
        if (!CollectionUtils.isEmpty(input.getListeAdresse())) {
            List<DtoListeDossierMajAdresse> listeAdresses = new ArrayList<DtoListeDossierMajAdresse>();
            for (int i = 0; i < input.getListeAdresse().size(); i++) {
                IAdresse adresse = input.getListeAdresse().get(i);
                DtoAdressePostale dtoAdressePostale = new DtoAdressePostale();
                dtoAdressePostale.setNomRue(adresse.getVoie());
                dtoAdressePostale.setCodePostal(adresse.getCodePostal());
                dtoAdressePostale.setLocalite(adresse.getVille());
                dtoAdressePostale.setLigne3(adresse.getPointGeographique());
                dtoAdressePostale.setComplementIdentiteDestinataire(adresse.getPointRemise());
                dtoAdressePostale.setLigne5(adresse.getBoitePostale());
                dtoAdressePostale.setPays(adresse.getCodePays());
                dtoAdressePostale.setValide(adresse.isIndicateurNormalisation());
                dtoAdressePostale.setCodeIris(adresse.getCodeIris());
                dtoAdressePostale.setRaisonModificationAdresse("I");
                dtoAdressePostale.setNatureOccupant(adresse.getQualiteOccupation());
                dtoAdressePostale.setTypeBatiment(adresse.getTypeLogement());
                
                dtoAdressePostale.setDateDerniereMaj(dateDuJour);
                dtoAdressePostale.setDateNormalisationAdresse(dateDuJour);
                
                if (NaturePersonne.PARTICULIER.equals(input.getNaturePersonne())
                                || NaturePersonne.PROFESSIONNEL.equals(input.getNaturePersonne())) {
                    dtoAdressePostale.setCodeTypeModeContact(PERSONNEL);
                } else {
                    dtoAdressePostale.setCodeTypeModeContact(PROFESSIONNEL);
                }
                
                DtoDetailAdressePostale detail = new DtoDetailAdressePostale();
                detail.setMotifNpai(adresse.getMotifNpai());
                detail.setDateNpai(dateDuJour);
                dtoAdressePostale.setInfoNPAI(detail);

                List<DtoAdressePostale> listeAdressePostale = new ArrayList<DtoAdressePostale>();
                listeAdressePostale.add(dtoAdressePostale);

                List<DtoListeDossierMajAdresse> listeDossierMajAdr = new ArrayList<DtoListeDossierMajAdresse>();

                DtoListeDossierMajAdresse dtoListeDossierMajAdresse = new DtoListeDossierMajAdresse();
                dtoListeDossierMajAdresse.setIsCourrier(adresse.isCourrier());
                dtoListeDossierMajAdresse.setIsFiscal(adresse.isFiscal());
                dtoListeDossierMajAdresse.setIsPrincipal(adresse.isPrincipal());
                dtoListeDossierMajAdresse.setDtoAdressePostale(dtoAdressePostale);

                if (adresse.isPrincipal()) {
                    dtoListeDossierMajAdresse.setSupprimerAncienneAdressePrincipale(false);
                }

                listeDossierMajAdr.add(dtoListeDossierMajAdresse);
                dtoListeDossierMajAdresse.setDtoAdressePostale(dtoAdressePostale);
                
                DtoMajInformationMarketingImmobilier infoImmo = new DtoMajInformationMarketingImmobilier();
                DtoMajBienImmobilier bienImmo = new DtoMajBienImmobilier();
                
                if (StringUtils.isNotEmpty(adresse.getNbPieces())) {
                    bienImmo.setNombrePiecesPrincipales(BigInteger.valueOf(Long.parseLong(adresse.getNbPieces())));
                }
                
                if (StringUtils.isNotEmpty(adresse.getSurface())) {
                    Quantity quantity = new Quantity();
                    quantity.setValue(BigDecimal.valueOf(Long.parseLong(adresse.getSurface())));
                    bienImmo.setSurfaceHabitable(quantity);
                }
                
                infoImmo.setBiensImmobiliersPossedes(bienImmo);
                
                if (StringUtils.isNotEmpty(adresse.getFondCommerce())) {
	                DtoMajModeExploitationFondCommerce modeExploit = new DtoMajModeExploitationFondCommerce();
	                modeExploit.setCode(adresse.getFondCommerce());
	                infoImmo.setModeExploitationFondCommerce(modeExploit);
                }
                
                dtoListeDossierMajAdresse.setDtoMajInformationMarketingImmobilier(infoImmo);
                
                listeAdresses.add(dtoListeDossierMajAdresse);
            }
            dossierContact.getAdresse().addAll(listeAdresses);
        }

        // Données téléphones
        if (!CollectionUtils.isEmpty(input.getListeTelephone())) {
            if (input.getListeTelephone() != null) {
                List<DtoListeDossierMajTelephone> listeTelephones = new ArrayList<DtoListeDossierMajTelephone>();
                for (int i = 0; i < input.getListeTelephone().size(); i++) {
                    ITelephone telephone = input.getListeTelephone().get(i);
                    if (StringUtils.isNotEmpty(telephone.getNumero())) {
                        DtoTelephone dtoTelephone = new DtoTelephone();
                        dtoTelephone.setNumero(telephone.getNumero());
                        dtoTelephone.setTypeTelephone(telephone.getType());
                        dtoTelephone.setExtension(telephone.getNumeroPoste());
                        dtoTelephone.setPrecisionTelephone(telephone.getPrecision());
                        dtoTelephone.setListeRouge(telephone.isListeRouge());

                        List<DtoTelephone> listeTelephone = new ArrayList<DtoTelephone>();
                        listeTelephone.add(dtoTelephone);

                        if (input.isPersonnePhysique()
                                        && !telephone.isProfessionnel()) {
                            dtoTelephone.setCodeTypeModeContact(PERSONNEL);
                        } else {
                            dtoTelephone.setCodeTypeModeContact(PROFESSIONNEL);
                        }

                        List<DtoListeDossierMajTelephone> listDossierMajTel =
                                        new ArrayList<DtoListeDossierMajTelephone>();

                        DtoListeDossierMajTelephone dtoListeDossierMajTelephone = new DtoListeDossierMajTelephone();
                        dtoListeDossierMajTelephone.setIsPrincipal(telephone.isPrincipal());
                        dtoListeDossierMajTelephone.setDtoTelephone(dtoTelephone);

                        listDossierMajTel.add(dtoListeDossierMajTelephone);
                        dtoListeDossierMajTelephone.setDtoTelephone(dtoTelephone);
                        listeTelephones.add(dtoListeDossierMajTelephone);
                    }
                }
                dossierContact.getTelephone().addAll(listeTelephones);
            }
        }

        // Données emails
        if (!CollectionUtils.isEmpty(input.getListeEmail())) {
            if (input.getListeEmail() != null) {
                List<DtoListeDossierMajCourriel> listeEmails = new ArrayList<DtoListeDossierMajCourriel>();
                for (int i = 0; i < input.getListeEmail().size(); i++) {
                    IEmail mail = input.getListeEmail().get(i);
                    if (StringUtils.isNotEmpty(mail.getAdresse())) {
                        DtoCourriel dtoCourriel = new DtoCourriel();
                        if (mail.isMotifNpai()) {
                            if (mail.getAdresse().startsWith(PREFIX_MOTIF_NPAI)) {
                                dtoCourriel.setAdresseCourriel(mail.getAdresse());
                            } else {
                                dtoCourriel.setAdresseCourriel(PREFIX_MOTIF_NPAI + mail.getAdresse());
                            }
                        } else {
                            if (mail.getAdresse().startsWith(PREFIX_MOTIF_NPAI)) {
                                dtoCourriel.setAdresseCourriel(mail.getAdresse().substring(PREFIX_MOTIF_NPAI.length(),
                                                mail.getAdresse().length()));
                            } else {
                                dtoCourriel.setAdresseCourriel(mail.getAdresse());
                            }
                        }
                        dtoCourriel.setPrecisionCourriel(mail.getPrecision());

                        List<DtoCourriel> listeCourriel = new ArrayList<DtoCourriel>();
                        listeCourriel.add(dtoCourriel);
                        
                        if (input.isPersonnePhysique()
                                        && !mail.isProfessionnel()) {
                            dtoCourriel.setCodeTypeModeContact(PERSONNEL);
                        } else {
                            dtoCourriel.setCodeTypeModeContact(PROFESSIONNEL);
                        }

                        List<DtoListeDossierMajCourriel> listeDossierMajCou =
                                        new ArrayList<DtoListeDossierMajCourriel>();

                        DtoListeDossierMajCourriel dtoListeDossierMajCourriel = new DtoListeDossierMajCourriel();
                        dtoListeDossierMajCourriel.setIsPrincipal(mail.isPrincipal());
                        dtoListeDossierMajCourriel.setDtoCourriel(dtoCourriel);

                        listeDossierMajCou.add(dtoListeDossierMajCourriel);
                        dtoListeDossierMajCourriel.setDtoCourriel(dtoCourriel);
                        listeEmails.add(dtoListeDossierMajCourriel);
                    }
                }
                dossierContact.getCourriel().addAll(listeEmails);
            }
        }

        // Données sites internet
        if (!CollectionUtils.isEmpty(input.getListeSiteInternet())) {
            if (input.getListeSiteInternet() != null) {
                List<DtoListeDossierMajPageWeb> listeSiteInternets = new ArrayList<DtoListeDossierMajPageWeb>();
                for (int i = 0; i < input.getListeSiteInternet().size(); i++) {
                    ISiteInternet siteInternet = input.getListeSiteInternet().get(i);

                    DtoPageWeb dtoPageWeb = new DtoPageWeb();
                    dtoPageWeb.setAdresseSiteWeb(siteInternet.getAdresse());

                    List<DtoPageWeb> listePageWeb = new ArrayList<DtoPageWeb>();
                    listePageWeb.add(dtoPageWeb);

                    if (input.isPersonnePhysique()
                                    && !siteInternet.isProfessionnel()) {
                        dtoPageWeb.setCodeTypeModeContact(PERSONNEL);
                    } else {
                        dtoPageWeb.setCodeTypeModeContact(PROFESSIONNEL);
                    }

                    List<DtoListeDossierMajPageWeb> listeDossierMajWeb = new ArrayList<DtoListeDossierMajPageWeb>();

                    DtoListeDossierMajPageWeb dtoListeDossierMajPageWeb = new DtoListeDossierMajPageWeb();
                    dtoListeDossierMajPageWeb.setIsPrincipal(siteInternet.isPrincipal());
                    dtoListeDossierMajPageWeb.setDtoPageWeb(dtoPageWeb);

                    listeDossierMajWeb.add(dtoListeDossierMajPageWeb);
                    dtoListeDossierMajPageWeb.setDtoPageWeb(dtoPageWeb);
                    listeSiteInternets.add(dtoListeDossierMajPageWeb);
                }
                dossierContact.getPageWeb().addAll(listeSiteInternets);
            }
        }

        return dossierContact;
    }
    
}
